var OVERED_DIV = false; // тайл над которым курсор
var OLD_OVERED_DIV = false; // тайл с которого убрали курсор
var minX = 100000; // левая граница карты
var minY = 100000; // верхняя граница карты
var maxX = 1; // правая граница карты
var maxY = 1; // нижняя граница карты
var TILE_SIZE = 59.4811; // сторона квадрата тайла в нормальных координатах
var ISO_ANGLE = Math.atan(0.5);// 26.565o угол при изометрии 2.5D, которая применяется в игре
var ISO_ANGLE_TAN = Math.tan(ISO_ANGLE);// 0.5
var ISO_ANGLE_SIN = Math.sin(ISO_ANGLE);// 0.447
var DIV_ISO_ANGLE_SIN = 1/ISO_ANGLE_SIN;
var ISO_ANGLE_COS = Math.cos(ISO_ANGLE);// 0.894
var DIV_ISO_ANGLE_COS = 1/ISO_ANGLE_COS;
var screenWidth = 827; // ширина видимой области экрана
var screenHeight = 400; // высота видимой области экрана
var TylesX = 50; // колво тайлов в большом ромбе
var TylesY = 50; // колво тайлов в большом ромбе
var TileWidth = 106; // ширина тайла в изометрии
var TileHeight = 27; // высота тайла в изометрии
var gameWidth = TileWidth * TylesX; // ширина карты
var gameHeight = TileHeight * TylesY; // высота карты

var moved = false; // двигается ли курсор по карте
var mapsize = {}; // информация о карте
var wait_for_ckick_response = false;// objects waiting for click function
var tiles = new Array(); // тайлы
//

function _getE(id)
{
    return document.getElementById(id);
}
if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1)
{
    is_chrome = true;
}
else
{
    is_chrome = false;
}

function getRandomInt(min, max)
 {
 return Math.floor(Math.random() * (max - min + 1)) + min;
 }

function _new(name)
{
    return document.createElement(name);
}

function getBounds(obj){
  var w=obj.offsetWidth;
  var h=obj.offsetHeight;
  var x=y=0;
  while(obj){
    x+=obj.offsetLeft;
    y+=obj.offsetTop;
    obj=obj.offsetParent;
  }
  return{left:x,top:y,width:w,height:h};
}

function trace_n()
{
    trace ('--------------------------');
}

function preload_image(src)
{
    pic = new Image();
    pic.src = src;
}

function drawmap()
{
    // рисуем локацию
    data = drawmap_process_data(); // обрабатываем массив
    drawmap_draw_location(data); // рисуем тайлы
    //drawmap_draw_objects(); // рисуем объекты
}

//additional funcs


// возвращает столбец и строку тайла по индексу
function GetPointByIndex(idx)
{
    var x = Math.floor(idx / mapsize.x); // строка
    var y = idx % mapsize.x ;// колонка
    return {
        'x':y,
        'y':x
    };
}

// возвращает x и y верхнего левого угла в пикселях по индексу для изометрии
function getTylePos(idx)
{
    var row = Math.floor(idx / mapsize.x); // строка
    var col = idx % mapsize.x ;// колонка
    var x = mapsize.add/2*mapsize.w+(mapsize.x * mapsize.w / 2) +mapsize.w*(row + col - 1)*0.5 - mapsize.w*row;
    var y = (row+col)*mapsize.h;
    return {
        x:x,
        y:y,
        row:row,
        col:col
    };
}

function isoToScreen(x,y){
    var sourceX = x;
    x = (x - y) * ISO_ANGLE_COS * TILE_SIZE;
    y = (sourceX + y) * ISO_ANGLE_SIN * TILE_SIZE;
    return {
        x:x,
        y:y
    };
}

//Из экранных координат объекта в координаты вида сверху (в тайловых координатах)
function screenToIso(x,y){
    var sourceX = x;
    x = (y * DIV_ISO_ANGLE_SIN + x * DIV_ISO_ANGLE_COS) * 0.5 / TILE_SIZE;
    y = (y * DIV_ISO_ANGLE_SIN - sourceX * DIV_ISO_ANGLE_COS) * 0.5 / TILE_SIZE;
    return {
        x:x,
        y:y
    };
}

// обрабатываем клик по тайлу и mouseover тайла, независимо от объектов на нем
function wait_for_div_changed()
{
    if(wait_for_ckick_response)
    {
        wait_for_ckick_response.style.background = 'none';
        wait_for_ckick_response = false;
    }
    if(OVERED_DIV && OVERED_DIV.id)
    {
        if(OVERED_DIV != OLD_OVERED_DIV)
        {
            // навели!
            $('#'+OVERED_DIV.id).animate({
                opacity:'0.7'
            },0);
            if(OLD_OVERED_DIV && OLD_OVERED_DIV != OVERED_DIV)
            {
                $('#'+OLD_OVERED_DIV.id).animate({
                    opacity:'1.0'
                },0);
            }
            OLD_OVERED_DIV =  OVERED_DIV;
        }
    //map_debug(OVERED_DIV.id+' over');
    }
    else
    {
        if(OLD_OVERED_DIV)
        {
            $('#'+OLD_OVERED_DIV.id).animate({
                opacity:'1.0'
            },0);
            OLD_OVERED_DIV = false;
        }
    //нет наведенного дива
    //map_debug('nope');
    }
}

function drawmap_process_data(mapsize_,data_)
{
    
    mapsize = {
        "x":TylesX,
        "y":TylesY,
        "w":106,
        "h":27,
        "h_r":70
    };
 
    mapsize.add = -mapsize.x+mapsize.y;
    arr = new Array();
    var drawit = false;
    var bx = 0;
    var by = 0;
    var coord = {};
    var tileName = 'grass0.png';// какой тайл рисовать
    //for(var i=mapsize.x*mapsize.y-1;i>=0;i--)
    for(var i=0;i<=mapsize.x*mapsize.y-1;i++)
    {
        bx = getRandomInt(0,0); // сдвиг фона в тайле по x
        by = getRandomInt(0,0); // сдвиг фона в тайле по y
        coord = GetPointByIndex(i);
        drawit = true;
        // ограничение слева
        if(coord.y>Math.round(mapsize.x/2))
            if(coord.x+Math.round(mapsize.x/2) < coord.y)
                drawit = false;
        // ограничение справа
        if(coord.x>Math.round(mapsize.x/2))
            if(coord.x-Math.round(mapsize.x/2) > coord.y)
                drawit = false;
        // ограничение сверху
        if(coord.x + coord.y < Math.round(mapsize.x/2) || (coord.x + coord.y > (mapsize.x*1.5)))
            drawit = false;
        
        if(drawit == true)
            arr[i]=([tileName,bx,by,coord.x,coord.y]);
    }
    return arr;
}

function drawmap_draw_location(arr)
{
    _getE('game_container').innerHTML = '';
    var game_holder = _new('DIV');
    game_holder.id = 'grass_holder';

    var sizes = {};
    var top = 0;
    var left = 0;
    // вычисляем границы карты
    for(var i in arr)
    {
        sizes = getTylePos(i);
        top = sizes.y;
        left = sizes.x;
        minX = Math.min(left, minX);
        minY = Math.min(top, minY);
        maxX = Math.max(left, maxX);
        maxY = Math.max(top, maxY);
    }
    
    minX += mapsize.w;
    minY += mapsize.h_r;
    var bgx = 0;
    var bgy = 0;
    // рисуем карту

    for(i in arr)
    {
        sizes = getTylePos(i);
        top = sizes.y;
        left = sizes.x;

        bgx = arr[i][1] * mapsize.w;
        bgy = arr[i][2] * mapsize.h_r;

        var tile = _new('DIV');
        tile.id = 'div'+i;
        tile.className = 'oneTile';
        tile.style.backgroundImage = 'url('+_globals["defines"]["STATIC_URL_IMG"]+arr[i][0]+')';
        tile.style.backgroundPosition = bgx.toString()+'px '+bgy.toString()+'px';
        tile.style.left = left - minX;
        tile.style.top = top - minY;
        game_holder.appendChild(tile);
        tiles[i] = tile;
    }
    // помещаем карту на экран и назначаем обработчики
    _getE('game_container').appendChild(game_holder);
    
    $('#grass_holder').click(function (event) {
        if (!moved)
        {
            if(OVERED_DIV)
                wait_for_ckick_response = OVERED_DIV;
        }
        moved = false;
    }).mousedown(function (event) {
        $(this)
        .data('down', true)
        .data('x', event.clientX)
        .data('y', event.clientY)
        .data('scrollLeft', this.scrollLeft)
        .data('scrollTop', this.scrollTop);
        return false;
    }).mouseup(function (event) {
        $(this).data('down', false);
    }).mousemove(function (event) {
        if(event.target)
        {
            if(event.target.id)
            {
                var target = event.target;
                var mouseX = this.scrollLeft+event.clientX+5;
                var mouseY = this.scrollTop+event.clientY+55;
                var iso = screenToIso(minX+mouseX,minY+mouseY);
                isoX = Math.ceil(iso.x-0.7)-27;
                isoY = Math.ceil(iso.y-0.7)+23;
                OVERED_DIV = _getE('div'+(isoY*mapsize.x+isoX));
            }
        }

        if ($(this).data('down') == true) {

            if(Math.abs(this.scrollLeft - $(this).data('scrollLeft')) > 30)
            {
                moved = true;
            }
            var newvvalLeft = Math.min($(this).data('scrollLeft') + $(this).data('x') - event.clientX,Math.round(maxX-screenWidth-minX+40-0));
            this.scrollLeft = newvvalLeft;
            var newvvalTop = Math.min($(this).data('scrollTop') + $(this).data('y') - event.clientY,Math.round(maxY-screenHeight-minY+25-0));
            this.scrollTop = newvvalTop;

        }
    }).mousewheel(function (event, delta) {
        }).css({
        'overflow' : 'hidden',
        'cursor' : '-moz-grab'
    });

    $('#grass_holder').scrollTo({
        left:0,
        top:0
    },0);

    setInterval(wait_for_div_changed,20); // и начинаем отслеживать курсор
}


